package com.huawei.classroom.student.h58;

import java.io.Closeable;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class VoteRecord {
	/**
	 * fileName是一个投票的明细记录，里面逐行存放了 投票的时间（yyyy-MM-dd HH:mm:ss 格式） +\t+投票的微信ID+\t+候选人
	 * 存放按时间递增（但是可能出现同一秒出现若干条记录的情况）
	 * 现在需要完成投票统计的过程，具体要求如下：
	 * 1个微信ID 1分钟内 最多投1票 多余的票数无效
	 * 1个微信ID 10分钟内 最多只能投5票 多余的票无效
	 * 其中微信ID不固定，候选人姓名不固定
	 * 测试的时候要求10万行记录处理时间不超过3秒 
	 * @param fileName
	 * @return 返回一个map，其中key是候选人名字，value的票数
	 */
	private static final long ten = 10*60*1000;
	private static final long one = 60*1000;
	public Map<String,Integer> calcRecording(String fileName){
		Map<String, Integer> map = new HashMap<>();
		try {
			String vote = readFromTxt(fileName);
			
			Map<String, wxid> wxid_map = new HashMap<>();
			String[] message = vote.split("\r\n");
			
			for(int i=0; i<message.length; i++) {
				String[] ticket = message[i].split("\t");
				if(wxid_map.containsKey(ticket[1])) {//已经投过
					Date now_time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(ticket[0]); 
					long xmin1 = (now_time.getTime() - wxid_map.get(ticket[1]).get_last_time().getTime());
					long xmin2 = (now_time.getTime() - wxid_map.get(ticket[1]).ten_min[0].getTime());
					if(wxid_map.get(ticket[1]).num == 5 && xmin2 > ten && xmin1 > one) {
						map.put(ticket[2], (map.get(ticket[2]) == null ? 1 : map.get(ticket[2]) + 1));
						wxid_map.get(ticket[1]).change(now_time);
					}else if(wxid_map.get(ticket[1]).num < 5 && xmin1 > one) {
						map.put(ticket[2], (map.get(ticket[2]) == null ? 1 : map.get(ticket[2]) + 1));
						wxid_map.get(ticket[1]).add_date(now_time);
					}
				}else {
					wxid_map.put(ticket[1], new wxid(ticket[0]));
					map.put(ticket[2], (map.get(ticket[2]) == null ? 1 : map.get(ticket[2]) + 1));
				}
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return map;
	}
	
	
	private String readFromTxt(String filename) throws Exception {
		Reader reader = null;
		try {
			StringBuffer buf = new StringBuffer();
			char[] chars = new char[1024];
			// InputStream in=new FileInputStream(filename);

			reader = new InputStreamReader(new FileInputStream(filename), "UTF-8");
			int readed = reader.read(chars);
			while (readed != -1) {
				buf.append(chars, 0, readed);
				readed = reader.read(chars);
			}
			return buf.toString();
		} finally {
			close(reader);
		}
	}
	
	private void close(Closeable inout) {
		if (inout != null) {
			try {
				inout.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
